﻿using System;
using System.Collections.Generic;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Zarion_Quest.LEVELS;

namespace Zarion_Quest.Base
{
    abstract class BaseShot : AnimatedObject2D
    {
        private List<Object2D> targets;
        public List<Object2D> Targets
        {
            get { return targets; }
        }
		private int speed;
        /// <summary>
        /// Velocidade do tiro
        /// </summary>
        public int Speed
        {
            get { return speed; }
            set { speed = value; }
        }

        private bool isLive;
        /// <summary>
        /// Indica se o tiro está "vivo", se não estiver ele é removido do jogo pelo ShotManager
        /// </summary>
        public bool IsLive
        {
            get { return isLive; }
            set { isLive = value; }
        }

        private int damage;
        /// <summary>
        /// Dano que o tiro inflinge
        /// </summary>
        public int Damage
        {
            get { return damage; }
            set { damage = value; }
        }

        // Parte de som totalmente conceitual, nunca usei estou fazendo sem poder testar...
        private SoundEffect shotSound;
        private SoundEffect hitSound;

		/// <summary>
		/// Construtor...
		/// </summary>
        /// <param name="texture">Imagem ou sprite sheet do tiro</param>
        /// <param name="position">Posição inicial do tiro</param>
        /// <param name="target">Alvo que o tiro deve perseguir</param>
		/// <param name="speed">Velocidade do tiro</param>
		/// <param name="columns">Quantidade de colunas que o sprite sheet possui</param>
        /// <param name="rows">Quantidade de linhas que o sprite sheet possui</param>
		/// <param name="shotSoundLocation">Localização do som do tiro, para ser usado no Content.Load</param>
        /// <param name="hitSoundLocation">Localização do som do tiro, para ser usado no Content.Load</param>
        public BaseShot(Texture2D texture, Vector2 position, Object2D target, int speed, int columns, int rows, String shotSoundLocation, String hitSoundLocation)
            : base(texture, columns, rows)
		{
            Position = position;
            this.targets = new List<Object2D>();
            this.targets.Add(target);
			this.speed = speed;
            isLive = true;

            shotSound = LevelManager.CurrentLevel.Content.Load<SoundEffect>(shotSoundLocation);
            hitSound = LevelManager.CurrentLevel.Content.Load<SoundEffect>(hitSoundLocation);
            shotSound.Play();
		}

        /// <summary>
        /// Construtor...
        /// </summary>
        /// <param name="texture">Imagem ou sprite sheet do tiro</param>
        /// <param name="columns">Quantidade de colunas que o sprite sheet possui</param>
        /// <param name="rows">Quantidade de linhas que o sprite sheet possui</param>
        /// <param name="position">Posição inicial do tiro</param>
        /// <param name="targets">Lista de alvos que o tiro deve testar colisão</param>
        /// <param name="speed">Velocidade do tiro</param>
        /// <param name="damage">Dano que o tiro inflinge</param>
        /// <param name="shotSoundLocation">Localização do som do tiro, para ser usado no Content.Load</param>
        /// <param name="hitSoundLocation">Localização do som do tiro, para ser usado no Content.Load</param>
        public BaseShot(Texture2D texture, int columns, int rows, Vector2 position, List<Object2D> targets, int speed, int damage, String shotSoundLocation, String hitSoundLocation)
            : base(texture, columns, rows)
        {
            Position = position;
            this.targets = targets;
            this.speed = speed;
            this.damage = damage;
            isLive = true;

            shotSound = LevelManager.CurrentLevel.Content.Load<SoundEffect>(shotSoundLocation);
            hitSound = LevelManager.CurrentLevel.Content.Load<SoundEffect>(hitSoundLocation);
            shotSound.Play();
        }
		
		/// <summary>
        /// Verifica se o alvo foi atingido. Esse método tem que ser chamado para poder realizar o tratamento da colizão
		/// </summary>
		/// <param name="alvo">O alvo do tiro</param>
		/// <returns>Verdadeiro se acertou, falso se não acertou</returns>
		private void hitTargetObject()
        {
            foreach (Object2D target in Targets)
		        if (this.hitTestObject(target))
                {
			        hitSound.Play();
                    isLive = false;
                    target.collisionNotifier(this);
		        }
		}

        public void destroy()
        {
            isLive = false;
        }

        public override void Update(GameTime gameTime)
        {
            hitTargetObject();
            base.Update(gameTime);
        }
    }
}
